﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AudiPyme.DAL
{
    public static class ControlesFactory
    {
        //Devuelve el número de controles totales en la base de conocimiento
        public static int ControlesTotales()
        {
            int numeroControles = 0;
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<Controles> ContrTotal = from Contr in agenteBD.ControlesEstablecer
                                               select Contr;
            foreach (Controles Contr in ContrTotal)
            {
                numeroControles++;
            }
            return numeroControles;
        }

        //Devuelve el nombre de un control según su Id
        public static String NombreControl(int IdControl)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            String Nombre = (from Contr in agenteBD.ControlesEstablecer
                             where Contr.IdControl == IdControl
                             select Contr.Nombre).Single();
            return Nombre;
        }

        //Devuelve la descripción de un control, según su Id
        public static String DescripcionControl(int IdControl)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            String Descripcion = (from Contr in agenteBD.ControlesEstablecer
                                  where Contr.IdControl == IdControl
                                  select Contr.Descripcion).Single();
            return Descripcion;
        }

        //Devuelve el nivel de madurez asociado a un control
        public static int NivelMadurezControl(int IdControl)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int NivMadContr = (from Contr in agenteBD.ControlesEstablecer
                               where Contr.IdControl == IdControl
                               select Contr.NivelMadurez).Single();
            return NivMadContr;
        }

        //Devuelve el identificador de un control
        public static int IdControl(string ControlSeleccionado)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<int> IdControl = from Contr in agenteBD.ControlesEstablecer
                                        where Contr.Nombre.Equals(ControlSeleccionado)
                                        select Contr.IdControl;
            if (IdControl.Count() == 0)
                return 0;
            else
                return IdControl.First();
        }

        //Número de controles que hay en cada nivel de madurez
        public static List<int> NumeroControlesTotalesNiveles()
        {
            //Recogemos el número de controles con Nivel de Madurez 1
            List<int> NumeroControlesNiveles = new List<int>(3);
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<Controles> ControlesNiv1 = from Contr in agenteBD.ControlesEstablecer
                                                  where Contr.NivelMadurez == 1
                                                  select Contr;
            //Si no ha encontrado ningún control es porque ha habido un error. Devolvemos un valor centinela
            if (ControlesNiv1.Count() == 0)
            {
                NumeroControlesNiveles.Insert(0, -1);
            }
            else
            {
                NumeroControlesNiveles.Insert(0, ControlesNiv1.Count());
            }
            //Recogemos el número de controles con Nivel de Madurez 2
            IQueryable<Controles> ControlesNiv2 = from Contr in agenteBD.ControlesEstablecer
                                                  where Contr.NivelMadurez == 2
                                                  select Contr;
            //Si no ha encontrado ningún control es porque ha habido un error. Devolvemos un valor centinela
            if (ControlesNiv2.Count() == 0)
            {
                NumeroControlesNiveles.Insert(1, -1);
            }
            else
            {
                NumeroControlesNiveles.Insert(1, ControlesNiv2.Count());
            }
            //Recogemos el número de controles con Nivel de Madurez 3
            IQueryable<Controles> ControlesNiv3 = from Contr in agenteBD.ControlesEstablecer
                                                  where Contr.NivelMadurez == 3
                                                  select Contr;
            //Si no ha encontrado ningún control es porque ha habido un error. Devolvemos un valor centinela
            if (ControlesNiv3.Count() == 0)
            {
                NumeroControlesNiveles.Insert(2, -1);
            }
            else
            {
                NumeroControlesNiveles.Insert(2, ControlesNiv3.Count());
            }
            return NumeroControlesNiveles;
        }

        //Número total de controles
        public static int NumeroTotalControles()
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int Controles = (from Contr in agenteBD.ControlesEstablecer
                             select Contr).Count();
            return Controles;
        }

        //Método que devuelve el conjunto de controles de la base de conocimiento 
        public static List<Controles> RecogeControles()
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<Controles> LControles = new List<Controles>();
            IQueryable<Controles> ControlesQuery = from ControlesObj in agenteBD.ControlesEstablecer
                                                   orderby ControlesObj.IdControl
                                                   select ControlesObj;
            if (ControlesQuery.Count() != 0)
            {
                LControles = ControlesQuery.ToList();
            }
            return LControles;
        }

        //Deserializa la respuesta de un control
        public static List<String> TiposRespuestasControles()
        {
            List<String> TiposRespuestas = new List<String>();
            TiposRespuestas.Insert(0, "SI");
            TiposRespuestas.Insert(1, "NO");
            TiposRespuestas.Insert(2, "PARC");
            TiposRespuestas.Insert(3, "N/A");
            return TiposRespuestas;
        }
    }
}
